package main

import (
	"fmt"
	"reflect"
)

func main() {
	// 1. 基本类型 New 出指针
	var a int
	t := reflect.TypeOf(a)
	ins := reflect.New(t)           // *int
	fmt.Println("ins ->", ins)      // &0
	fmt.Println("kind", ins.Kind()) // ptr

	// 2. 切片：用 MakeSlice
	sliceT := reflect.SliceOf(t)              // []int
	sliceV := reflect.MakeSlice(sliceT, 2, 4) // 长度 2 容量 4
	sliceV.Index(0).SetInt(100)
	fmt.Println("sliceV ->", sliceV.Interface()) // [100 0]

	// 3. 映射：用 MakeMap
	mapT := reflect.MapOf(t, reflect.TypeOf("")) // map[int]string
	mapV := reflect.MakeMap(mapT)
	mapV.SetMapIndex(reflect.ValueOf(1), reflect.ValueOf("one"))
	fmt.Println("mapV ->", mapV.Interface()) // map[1:one]

	// 4. 通道：用 MakeChan
	chanT := reflect.ChanOf(reflect.BothDir, t) // chan int
	chanV := reflect.MakeChan(chanT, 1)
	chanV.Send(reflect.ValueOf(42))
	val, ok := chanV.Recv()
	fmt.Println("chan recv ->", val.Int(), ok) // 42 true
}
